Skip to main content

性能优化

在本页上,我们将向您展示如何为您的设备和应用程序设置基于 Linux 的 CODESYS Control SL 产品,以便尽可能获得最佳性能。

我们为您提供可用于检查和评估系统当前状态的工具。

我们建议采用以下程序。按指定顺序完成这些步骤。如果当前步骤没有按需要进行优化,那么继续下一步是没有意义的

  1. 检查硬件

  2. 设置 Linux

  3. 配置 CODESYS-运行时系统

  4. 配置 IEC 应用程序

重要

完成每个步骤后,检查最近的更改是否对先前步骤中所做的改进产生了负面影响。

在正常负载下达到所需的性能后,您可以选择在高负载下执行测试 stress-ng 或者 iperf。

您可以在以下网站上找到更多信息:

检查硬件

  • 不要对控制器的处理器核心使用共享缓存。

  • 如果您为目标设备使用基于以太网的现场总线,则为其使用物理适配器。不要使用交换机架构。

设置 Linux

  • 使用实时内核。

    重要

    在 Linux 上进行实时操作,请使用 Realtime PREEMPT 补丁。使用低延迟内核是不够的,因为它不能保证确定的实时属性

    有关更多信息,请参阅以下内容:

    以下许多系统设置也可以通过运行时系统直接使用 PLCShell 进行配置,也可以直接通过运行时系统的配置文件进行配置。某些系统设置不会在系统重启后持续存在。通过将设置输入到配置文件中,运行时系统启动时将自动恢复设置。运行相应的 PLCShell 命令还会将相应的条目添加到配置文件中

    plcShell 命令

    配置文件输入

    函数

    rt-get scaling_governor/kernelinfo/hyperthreading/throttling/napi <device>

    返回有关系统设置的信息

    例 3. 示例

    rt-get scaling_governor

    显示可用的缩放调控器,并返回为内核配置的缩放调控器



    rt-set scaling_governor <cpu_index> <value>

    [CmpLinuxRTDiag]
    ScalingGovernor.CPU0=performance

    将特定内核或所有内核的缩放调控器设置为指定选项

    例 4. 示例

    set scaling_governor all performance



    rt-set hyperthreading <state>

    [CmpLinuxRTDiag]
    Hyperthreading=off

    开启/关闭超线程

    rt-set throttling <state>

    [CmpLinuxRTDiag]
    Throttling=off

    开启/关闭节流功能

    rt-set napi <device> <state>

    [CmpLinuxRTDiag]
    Napi=eno1

    为网络适配器启用或禁用线程 NAPI

    rt-clear-settings

    全部删除 rt-set 配置文件中的设置

    rt-marker-set <taskname> <threshold>

    [CmpLinuxRTDiag]
    TraceMarker.TaskName=MainTask
    TraceMarker.ThresholdUs=100
    
    [SysTask]
    Linux.MeasureInterval=1

    当抖动超过指定限制时,允许为指定任务写入内核跟踪标记。

    仅当运行时以 root 用户身份运行时才可用

    rt-marker-disable

    禁用内核跟踪标记

    rt-marker-get

    指定为内核跟踪标记和抖动限制配置的任务名称

    irq-list

    列出所有可用的 IRQ、其优先级和系统上的关联性

    irq-set-prio <no | device> <priority>

    [CmpLinuxInterrupt]
    Interrupt.1.Priority=51
    Interrupt.1.Device=eno1

    Sets the priority of interrupts specified either by number <no> or device <device> to the desired value

    irq-set-affinity <no | device> <bitmask>

    [CmpLinuxInterrupt]
    Interrupt.1.Affinity=128
    Interrupt.1.Device=eno1

    Sets the core affinity of the interrupt specified either by number <no> or device <device> to the desired bitmask

    irq-clear-settings

    全部删除 irq sets 配置文件中的设置

    对于实时需求,需要使用 RT 抢占内核 (https://wiki.linuxfoundation.org/realtime/documentation/start) 适用于你的 Linux 系统。对于 Debian 和 Ubuntu 发行版,你会发现 RT 内核是一个软件包,你可以使用它轻松安装 apt 命令。有关这方面的详细信息,请参阅您的发行版手册。

    • 在 Debian 系统上

      sudo apt-get install linux-image-rt-amd64

    • 例如,使用命令检查你正在使用哪个内核 uname -a。

  • 避免在系统上使用 Windows 管理器、GUI/X 服务器或类似工具。

    使用这些工具可能会影响系统的实时功能,从而导致 IEC 应用程序出现高抖动。

测试

使用“rt-tools”:

  • 安装“rt-tools”: sudo apt install rt-tests

  • 开始“循环测试”: sudo cyclictest -p 99 -t -m

  • 这 man cyclictest 命令向您显示更多命令行选项,您可以使用它们更好地测量系统的更多或特定性能方面。

该值是否由下式确定 cyclictest 可以视为 “良好” 取决于您的硬件。如果您使用的是非常强大的处理器(例如,英特尔酷睿 i7),则最大值应为 1 位数的较低。如果你使用的是旧的 ARM 处理器,那么 100 可能是一个不错的结果。

优化选项

重要

更改每项设置或设置组合后,应运行 cyclictest 程序来验证变更的有效性。

这些设置不是永久性的,因此必须在系统启动或重新启动后重置。

注意

在 4.21.0.0 及更高版本中, CODESYS 提供了一个 PLC Shell 命令,该命令直接输出其中的大多数值。要执行此操作,请运行 system-creatertreport 命令。有关该命令的更多详细信息,请运行 system-creatertreport ?。

  • 禁用 CPU 节能模式。

  • 禁用超线程。

    您可以使用以下命令禁用超线程(示例):

    echo off | sudo tee /sys/devices/system/cpu/smt/control
  • 尽可能禁用 CPU 频率调整和切换。

    例如,将最小和最大 CPU 频率设置为相同(固定)值。

  • 禁用 Linux 内核的实时限制机制,因为这可能会导致系统抖动。

    有关更多信息,请参阅以下内容: Linux 基金会:日程安排 — RT 节流

    您可以使用以下命令禁用实时限制(示例):

    echo -1 > /proc/sys/kernel/sched_rt_runtime_us
  • 检查并更改调度/缩放调控器。

    • 检查使用的调度/缩放调控器:

      cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
    • 更改使用的调度/缩放调控器(如 root/admin) 到 Performance:

      echo "performance" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
      # set it for all available cores:
      echo "performance" > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor
      echo "performance" > /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor
      echo "performance" > /sys/devices/system/cpu/cpu3/cpufreq/scaling_governor

      请注意,每次启动系统时都必须重置缩放调控器。您也可以通过内核配置对其进行设置。

      这个 intel_pstate 内核驱动程序会使正确的设置变得更加困难。因此,你应该使用 cpufreq-info 命令检查您的配置。

    • 你也可以使用诸如此类的程序 cpu-freq-utils。这可能会干扰英特尔的 pstate 驱动程序。这些驱动程序通常需要不同的方法来设置 CPU 频率。

    • 有关更多信息,请参阅以下内容: https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt

  • 禁用 HyperV 在 BIOS 中(如果可用)。

配置 CODESYS-运行时系统

  • 创建一个测试应用程序,大致描述您要优化系统的应用程序(在所需资源、所需性能和项目规模方面)。

  • 您可以迭代地执行此操作:首先创建一个非常粗略的近似值,然后对其进行扩展以越来越接近实际应用程序。

测试

当应用程序运行时,检查任务配置。打开 任务配置 并选择 监视器 标签。

_rtsl_img_performance_oprimization_cds.png
  • 分钟。抖动 (μs) / 最大抖动(微秒)

  • 平均周期时间(微秒)/最大周期时间周期时间 (µs) 周期时间 (µs)

    • 最大周期不应接近配置的周期时间。一旦系统遇到高负载,这就会导致问题。

    • 始终保持周期时间尽可能短。

优化选项

重要

更改每项设置或设置组合后,应运行 cyclictest 程序来验证变更的有效性。

  • 将长时间运行的任务拆分为多个较小的任务。

  • 运行时,最高优先级任务的最大循环时间不应达到配置的循环时间。如果无法避免这种情况,则应增加配置的周期时间以确保一致的执行时间。

  • 启动现场总线系统(例如 EtherCAT 或 PROFINET)时,启动周期可能会导致 CPU 负载稍高。在这种情况下,在启动应用程序后不久监控 CPU 负载是有意义的。

以下选项无法更改 CODESYS Virtual Control SL,但需要在主机上配置:

  • 设置值 DisableCpuDmaLatency 至 1:

    [SysCpuHandling]
    Linux.DisableCpuDmaLatency=1
    • 请注意,这是运行时版本 4.11.0.0 的默认设置。

    • 要检查您的运行时版本,请单击 附加功能 → 更新Linux → 系统 → 系统信息。

  • 验证是否确实在使用实时内核。

    • 从版本 4.11.0.0 开始,您可以使用 PLC shell 命令 rt-get kernelinfo 检查这个。

    • 如果您使用的是旧版本,则可以直接在命令行上使用以下命令进行测试 uname -a 命令。

    • 如果未使用实时内核,则需要从头开始优化。

配置 IEC 应用程序

本节涉及您的实际应用。

测试

优化选项

重要

更改每个设置或设置组合后,应运行“循环测试”程序来验证更改的有效性。

  • 您可以使用 多核 特色于 CODESYS。

  • 确定任务的正确优先级。重要的任务应该有更高的优先级。

    表 6. IEC任务优先级和Linux线程优先级的映射:

    IEC 任务优先级

    运行时优先级

    Linux优先级

    --

    0

    88(SCHED_FIFO)

    --

    31

    57(SCHED_FIFO)

    0(最高实时优先级)

    32

    56(SCHED_FIFO)

    15(最低实时优先级)

    47

    41(SCHED_FIFO)

    16(非实时优先级)

    48

    0 (SCHED_OTHER)

    31(非实时优先级)

    63

    0 (SCHED_OTHER)

    --

    64

    0 (SCHED_OTHER)

    --

    255

    (SCHED_IDLE)

    注意

    传统的 Linux 系统上,大多数中断 (IRQ) 和内核工作程序的优先级为 Linux 50。使用上述优先级(高负载)可能会导致系统功能(网络/存储)无法按预期运行



  • 您可以在相应的任务配置中配置任务的优先级。

    _rtsl_img_performance_iec.PNG

如果在执行此处提到的所有步骤后仍未达到所需的性能,那么您可以查看以下部分:

现场总线特定信息

测试

  • 检查 Send Time / Recv Time EtherCAT 状态页面上的值。

    • 配备 Intel Core i7 处理器和良好适配器的 x64 CPU 的时间应该少于 10μs。

    • 具有集成芯片的 ARM 处理器将具有约 50μs 或更长的时间。

    _rtsl_img_performance_ecat.png
  • 检查 Send Time / Recv Time PROFINET 状态页上的值。

    • 配备 Intel Core i7 处理器和良好适配器的 x64 CPU 的时间应该少于 10μs。

    • 具有集成芯片的 ARM 处理器将具有约 50μs 或更长的时间。

    _rtsl_img_performance_pn.png

优化选项

  • 要对优先级和所需的 IRQ 进行排序,您可以使用 PLC shell 命令 irq-list 和 irq-set-prio。

    • 这些命令使用正常的 Linux 优先级,而不是 IEC 优先级。

    • 这种优化在以下情况下是不可能的 CODESYS Virtual Control SL,而是在主机系统上。

  • 为设备使用单独的网络适配器。

  • 有关更多信息,请参阅:

[针对专家] – 其他工具和主题

本节中描述的工具和选项适用于高级用户。由于要采取的行动在很大程度上取决于具体的系统,因此需要进行独立研究。因此,我们无法为您提供任何具体的解决方案。

  • KernelShark / 内核跟踪

    • 如果您发现日程安排是性能问题的原因,那么这是您的首选程序。使用 “内核跟踪”,您可以检查您的任务是否被其他任务、服务或中断中断

      • trace-cmd record -p function

      • 您可以使用 KernelShark 检查生成的 trace.dat 文件。

    • 一般来说,调度问题可以分为两类:

      • 取代/抢占

        • 如果不需要中断或阻止执行的任务,则禁用它。

        • 提高您的任务的优先级或降低其他任务的优先级。

        • 切换到不同的 CPU 核心。

        重要

        使用上一章中描述的程序验证更改的有效性。

      • 执行时间

        请参阅下面的 “内核函数跟踪”

  • 内核函数跟踪

    • 如果代码执行时间太快,你可以使用这个工具来查明问题

    • 如果执行时间太长的函数在您自己的代码中,那么您需要对其进行优化。

    • 如果该函数太慢而无法在内核中执行,你可以尝试使用另一个内核函数来实现所需的功能。或者,你可以将配置参数传递给内核驱动程序以缩短执行时间

    • 如果这些选项都不能解决问题,则可能需要使用更强大的硬件。

使用以下几点来验证是否包含实现绩效目标的正确工具:

  • PREEMPT_FULL

  • 独立CPU

  • rcu_nocbs

  • rcu_nocb_poll

  • 无软锁定

  • 中断平衡禁用

  • kernel.sched_rt_runtime_us